﻿using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;

namespace VNPT.DoiSoat
{
    public partial class Form3 : DevExpress.XtraEditors.XtraForm
    {
        public Form3()
        {
            InitializeComponent();
            this.Shown += (a, e) =>
            {

            };
        }
        class MultiThreadDemoObj
        {
            public string name { get; set; }
            [DefaultValue(0)]
            public object percent { get; set; }
        }
        private bool _is_stoped;
        private int num_threads;

        private void LoadGridView()
        {
            // Khởi tạo datasource
            IList<MultiThreadDemoObj> dsource = new List<MultiThreadDemoObj>();
            for (int i = 1; i <= num_threads; i++)
            {
                dsource.Add(new MultiThreadDemoObj() { name = "Thread " + i });
            }
            // Gắn datasource cho gridview
            dataGridView1.DataSource = dsource;
        }
        private void DoWorkMultiThread(object o)
        {
            int index = (int)o;

            for (int i = 1; i <= 100; i++)
            {
                // Làm việc trong khoảng 100+index*10 milisecond
                Thread.Sleep(100 + index * 10);
                // Báo tiến trình
                dataGridView1.Rows[index].Cells["colProgress"].Value = i.ToString() + " %";
                // Kiểm tra nếu dừng
                if (_is_stoped)
                {
                    // rollback quá trình hay làm các việc khác
                    return;
                }
            }
            dataGridView1.Rows[index].Cells["colProgress"].Value = "Finished";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            _is_stoped = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            _is_stoped = false;
            // Lấy số theads
            try
            {
                num_threads = int.Parse(s.Text);
            }
            catch { return; }

            // Load gridview
            this.LoadGridView();

            // Khởi tạo số tiến trình ít nhất cho Theadpool
            int minWorker, minIOC;
            ThreadPool.GetMinThreads(out minWorker, out minIOC);
            //ThreadPool.SetMinThreads(num_threads-3, minIOC-3);
            ThreadPool.SetMaxThreads(3, 5);
            // Bắt đầu làm việc với đa tiến trình
            for (int s = 0; s < num_threads; s++)
            {
                // Cho DoWorkMultiThread vào hàng đợi và thực hiện
                ThreadPool.QueueUserWorkItem(new WaitCallback(DoWorkMultiThread), (object)s);
            }
        }

    }
}
